11.MyBatis的嵌套查询 您所在的位置:网站首页 嵌套select with ur 11.MyBatis的嵌套查询

11.MyBatis的嵌套查询

2023-07-04 12:57| 来源: 网络整理| 查看: 265

11.MyBatis的嵌套查询 1.什么是嵌套查询

嵌套查询就是将原来多表查询中的联合查询语句拆成单个表的查询,再使用mybatis的语法嵌套在一 起。

例子:

* 需求:查询一个订单,与此同时查询出该订单所属的用户 1. 联合查询 SELECT * FROM orders o LEFT JOIN USER u ON o.`uid`=u.`id`; 2. 嵌套查询 2.1 先查询订单 SELECT * FROM orders 2.2 再根据订单uid外键,查询用户 SELECT * FROM `user` WHERE id = #{根据订单查询的uid} 2.3 最后使用mybatis,将以上二步嵌套起来 复制代码 2.一对一嵌套查询

需求:查询一个订单,与此同时查询出该订单所属的用户

sql语句

-- 先查询订单 SELECT * FROM orders; -- 再根据订单uid外键,查询用户 SELECT * FROM `user` WHERE id = #{订单的uid} 复制代码 2.1代码实现

(1)OrderMapper接口

// 查询用户订单 List findUserOrders(); 复制代码

(2)OrderMapper.xml映射

一对一查询 select * from orders 复制代码

(3)userMapper接口

// 嵌套查询:查询订单拥有者 List findUserOrderByNested(@Param("uid") Integer uid); 复制代码

(4)UserMapper.xml映射

select * from `user` where id = #{uid} 复制代码

(5)测试方法

@Test public void test5() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class); List userOrders = ordersMapper.findUserOrders(); for (Orders orders : userOrders){ System.out.println(orders); } sqlSession.close(); } 复制代码

(6)测试结果

image-20220223203701653

2.2流程解析

image-20220223203759978

3.一对多嵌套查询

需求:查询所有用户,与此同时查询出该用户具有的订单

一对多查询语句

-- 先查询用户 SELECT * FROM `user`; -- 再根据用户id主键,查询订单列表 SELECT * FROM orders where uid = #{用户id}; 复制代码 3.1代码实现 思想: 先找到所有用户信息(即先在用户操作类xml查询出用户信息) 得到用户id后去查询订单表信息(关联查询) 根据uid=id(用户id)查询出结果

(1)userMapper接口

//嵌套查询: 查询用户的订单信息(一对多) List findUserOrder2(); 复制代码

(2)UserMapper.xml映射

select * from user 复制代码

(3)OrderMapper接口

//嵌套查询:查询用户的订单 List findUserAllOrder(@Param("id") Integer id); 复制代码

(4)OrderMapper.xml映射

select * from orders where uid = #{id} 复制代码

(5)测试方法

/** * 嵌套查询:一对多 * 查询用户对应的订单信息 * @throws IOException */ @Test public void test6() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List userOrders = userMapper.findUserOrder2(); for (User userOrder : userOrders){ System.out.println(userOrder); } sqlSession.close(); } 复制代码

(6)测试结果

image-20220223211232922

4.多对多嵌套查询

需求:查询用户,同时查询出该用户的所有角色

查询语句

-- 先查询用户 SELECT * FROM `user`; -- 再根据用户id主键,查询角色列表 SELECT * FROM role r INNER JOIN user_role ur ON r.`id` = ur.`rid` WHERE ur.`uid` = #{用户id}; 复制代码 4.1代码实现

(1)userMapper接口

/** * 嵌套查询:查询用户对应的角色信息 */ List findAllWithRole(); 复制代码

(2)UserMapper.xml映射

select * from `user` 复制代码

(3)RoleMapper接口

public interface RoleMapper { List getRolelist(Integer id); } 复制代码

(4)RoleMapper.xml映射文件

SELECT * FROM sys_role r INNER JOIN sys_user_role ur ON r.id = ur.roleid WHERE ur.userid= #{id} 复制代码

(5)测试类

/** * 嵌套查询:多对多 * 查询用户对应的角色 * @throws IOException */ @Test public void test7() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List userOrders = userMapper.findAllWithRole(); for (User userOrder : userOrders){ System.out.println(userOrder); } sqlSession.close(); } 复制代码

(6)测试结果

image-20220223225939829

5.小结 一对一配置:使用+做配置,通过column条件,执行select查询 一对多配置:使用+做配置,通过column条件,执行select查询 多对多配置:使用+做配置,通过column条件,执行select查询 优点:简化多表查询操作 缺点:执行多次sql语句,浪费数据库性能


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有